/*
 *****************************************************************************
 * Copyright (C) 2005-2014 UC Mobile Limited. All Rights Reserved
 * File			: G9SDK.h
 *
 * Description	: SDK入口，通过单例sharedInstance访问
 *
 * Author		: wanghuai@ucweb.com
 *
 * History		: Creation, 15/10/31, wanghuai@ucweb.com, Create the file
 ******************************************************************************
 **/

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "G9SDKRoleInfo.h"

@class G9SDKOrder;

@class SKPaymentTransaction;

/** 绑定手机号码结果 */
typedef NS_ENUM(NSUInteger, G9SDKBindPhoneResult){
    G9SDKBindPhoneCanceled, //用户取消绑定
    G9SDKBindPhoneSuccess,  //绑定成功
    G9SDKBindPhoneFailed,   //绑定失败
};

typedef NS_ENUM(NSUInteger, G9SDKOperationType)
{
    G9SDKOperationTypeGetOfflinePrivilege,
};

typedef NS_ENUM(NSUInteger, G9SDKOperationPageType) {
    G9SDKOperationPageTypeActivity,  // 运营活动页面， v2.1.0 支持
    G9SDKOperationPageTypeMall,      // 商城， v2.1.1 支持
    G9SDKOperationPageTypeMailBox,   // 邮箱, v2.1.1 支持
};




/**
 *  开启或者关闭log
 */
FOUNDATION_EXTERN void setG9SDKLogEnable(BOOL enable);


@class G9SDKGameInfo, G9SDKError;

/**
 *  G9SDK 的回调
 */
@protocol G9SDKDelegate <NSObject>

@optional

/**
 *  SDK执行的内部错误的回调，可以通过error.errMessage查看具体操作错误信息
 */
- (void)g9_SDKOperationError:(G9SDKError *)error
__attribute__((deprecated("g9_SDKOperationError接口 1.6.0 版本后 这些错误回调都会归属到各个流程。这个接口将不再有回调")));


/**
 *  成功初始化的回调
 */
- (void)g9_SDKDidFinishInit;

/**
 *  初始化失败的回调，可以通过error.errMessage查看具体错误提示
 */
- (void)g9_SDKFailInit:(G9SDKError *)error;

/**
 *  登录成功的回调，会返回sid，如果是单机的离线试玩，则sid为nil，通过服务器对接的方式拿sid换取用户信息
 */
- (void)g9_SDKLoginSuccessWithSid:(NSString *)sid;

/**
 *  登录失败
 */
- (void)g9_SDKLoginFail:(G9SDKError *)error;

/**
 *  SDK log的回调，通过setG9SDKLogEnable(YES) 开启log
 */
- (void)g9_SDKLog:(NSString *)log;

/**
 *  绑定手机号回调
 *
 *  @param result 绑定手机号码结果
 */
- (void)g9_SDKDidBindPhoneWithResult:(G9SDKBindPhoneResult)result;

/**
 扫码授权登录结果回调
 
 @param isSuccess 是否成功
 @param err 失败，错误信息
 */
- (void) g9_SDKAuthScanWithResult:(BOOL) isSuccess
                            error:(G9SDKError*) err;


/**
 扫码支付结果回调

 @param isSuccess 是否成功
 @param order 成功返回订单信息
 @param transcantion 失败返回错误交易
 @param error 失败返回错误信息
 */
- (void) g9_SDKIAPScanWithResult:(BOOL) isSuccess
                         success:(G9SDKOrder*) order
                    transcantion:(SKPaymentTransaction*) transcantion
                           error:(NSError*) error;


/**
 运营相关页面关闭回调

 @param pageType 关闭的页面类型
 @param info  扩展参数
 */
- (void)g9_SDKOperationPageDidDismissWithPageType:(G9SDKOperationPageType)pageType extInfo:(NSDictionary *)info;

/**
 SDK通过此接口获得游戏的window，解决游戏输入框在某些情况下无法获得键盘的问题，
 若不实现这个方法，SDK 会将初始化时的 keyWindow 作为游戏 Window，建议都实现此方法

 @return 当前游戏 Window；
         注意：这里需要返回游戏自己管理的游戏 Window，而不是 [UIApplication sharedApplication].keyWindow
 */
- (UIWindow *)g9_gameWindow;

/**
 SDK通过此方法获得游戏的ViewController
 @return 游戏的ViewController，例如在Unity中可如下实现: return GetAppController().rootViewController;
 */
- (UIViewController *)g9_gameViewController;

/**
 *  SDK 将要登出（防沉迷时会触发登出）
 *  接入方完成自己事情后，执行 completion()，让 SDK 内部也登出;
 */
- (void)g9_SDKWillLogoutWithCompletion:(void (^)(void))completion;

/**
 *  SDK 已经登出（防沉迷时会触发登出）
 */
- (void)g9_SDKDidLogout;

@end

@interface G9SDK : NSObject
@property (nonatomic, weak) id<G9SDKDelegate> delegate;


+ (instancetype)sharedInstance;

/**
 *  @return SDK版本号
 */
+ (NSString *)sdkVersion;

/**
 *  初始化方法，需要传入GameInfo对象，设置GameId，CpId
 */
- (void)initSDKWithGameInfo:(G9SDKGameInfo *)gameInfo;

/**
 *  展示登录界面
 */
- (void)login;

/**
 *  使用第三方授权登录之后的回调处理，必需在UIApplication的- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
 *  中调用该方法。
 *
 */
- (BOOL)handleUrl:(NSURL *)url;


/**
 *  绑定手机号码
 */
- (void)bindPhoneNumber;

/**
 *  设置角色信息，发起IAP支付时，会取此接口设置的角色信息
 *  请在这几个时机调用此接口：创建角色／角色进入游戏／角色升级／角色退出游戏，并且设置相应的roleInfo的 opportunityType 值（见G9SDKRoleInfo.h中定义）
 */
- (void)setRoleInfo:(G9SDKRoleInfo *)roleInfo;

@end

@interface G9SDK (Operation)

/**
 *  (仅单机有效)执行操作，操作结果将通过completion进行回调
 *
 *  @param operationType 传入操作类型，目前仅支持获取特权信息
 *  @param completion 操作结果会通过completion进行回调，id为任意类型，特权信息的类型为NSString *
 */
- (void)execOperation:(G9SDKOperationType)operationType
            completin:(void (^)(id ret, G9SDKError *error))completion;

@end

/**
 *  经分打点
 */
@interface G9SDK (EventLog)

/**
 *  上传经分打点数据，具体打点参数请参考经分日志上报规范
 *  @param event    事件名称
 *  @param data     事件参数
 */
- (BOOL)commitEvent:(NSString *)event data:(NSDictionary *)data;

@end

/**
 *  扫码
 *  包含两种码：PC 授权登录码，PC支付码
 授权登录码是否成功 回调到： G9SDKDelegate - g9_SDKAuthScanWithResult 函数
 支付码支付成功 回调到：G9SDKIAPManagerDelegate - purchaseDidSuccessWithResult / purchaseDidFailureWithError
 所以请在扫码支付之前 务必设置 G9SDKIAPManager id<G9SDKIAPManagerDelegate> 值，否则无回调。
 */
@interface G9SDK (QRScan)

/**
 扫码：必须初始化完成，登录后才能够调用。未初始化只会返回NO。 未登录则直接调用登录接口，同时返回NO
 @param extInfo 透传参数，最长1000个字符，可通过服务端轮询二维码扫描接口获得此透传参数（仅对扫码登录有效）
 @return 初始化完成，登录后调用返回YES、否则未初始化或者未登录返回NO。
 */
- (BOOL) qrScanWithExtInfo:(NSString *)extInfo;

@end

@interface G9SDK (WebView)

/**
 客服 - 显示客服 webview
 */
- (void)showCustomerServiceWebView;


/**
 用研 - 显示用研 webView
 */
- (void)showUserSurveyWebView;

@end

@interface G9SDK (Operations)

/**
显示运营页面
 */
- (void)showOperationPageWithType:(G9SDKOperationPageType)type;

// 运营消息未读数变化通知，CP 通过监听这个通知来修改运营入口红点显示
// 通知回调 NSNotification 的 object 会返回一个 G9SDKUnread 对象，包含所有红点展示相关信息；
FOUNDATION_EXPORT NSString *const G9OperationUnreadChangeNotification;

@end

@interface G9SDK (Share)

/**
 分享图片
 @param completion 分享结果的回调，透传系统分享结果回调，分享结果不同平台存在差异:
 例如分享到 QQ，调起分享面板后，点击分享给好友或者QQ空间，拉起 QQ app 后就回调分享成功；
 微信则点击分享到好友或朋友圈，展示分享进度，分享成功后用户点击确定按钮后才回调。
 */
- (void)shareWithImage:(UIImage *)image completion:(void (^)(BOOL completed))completion;

/**
 分享链接。 支持网页链接或者本地视频链接。
 本地视频大小、长度受各平台限制
 @param completion 分享结果的回调，透传系统分享结果回调，分享结果不同平台存在差异:
 例如分享到 QQ，调起分享面板后，点击分享给好友或者QQ空间，拉起 QQ app 后就回调分享成功；
 微信则点击分享到好友或朋友圈，展示分享进度，分享成功后用户点击确定按钮后才回调。
 */
- (void)shareWithURL:(NSURL *)url completion:(void (^)(BOOL completed))completion;

@end
